#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<ctype.h>
//char* my_strncpy(char* dest, const char* src, size_t num)
//{
//	assert(dest && src);
//
//	char* ret = dest;
//	while (num-- && *src != '\0')
//	{
//		*dest++ = *src++;
//	}
//	if (num) *dest = '\0';
//	return ret;
//}
//int main()
//{
//	char arr[] = "hello world";
//	char s[20] = { 0 };
//	my_strncpy(s, arr, 7);
//	printf("%s\n", s);
//	return 0;
//}

//char* my_strcat(char* dest, const char* src)
//{
//	assert(dest, src);
//	char* ret = dest;
//	//找到目标空间的\0
//	while (*dest != '\0')
//		dest++;
//	//拷贝
//	while (*dest++ = *src++)
//		;
//	return ret;
//}
//
//int main()
//{
//	char arr1[20] = "hello ";
//	char arr2[] = "world";
//	printf("%s\n", my_strcat(arr1, arr2));
//	return 0;
//}

//char* my_strncat(char* dest, const char* src, size_t num)
//{
//	assert(dest, src);
//	char* ret = dest;
//	//找到目标空间的\0
//	while (*dest != '\0')
//		dest++;
//	//拷贝
//	int i;
//	for (i = 0; src[i] && i < num; i++)
//	{
//		dest[i] = src[i];
//	}
//	dest[i] = '\0';
//	return ret;
//}
//int main()
//{
//	char arr[20] = "hello world";
//	char s[] = "xxxxx";
//	my_strncat(arr, s, 5);
//	printf("%s\n", arr);
//	return 0;
//}

//int my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	while (*str1 == *str2)
//	{
//		if (*str1 == '\0') return 0;
//		str1++;
//		str2++;
//	}
//	/*if (*str1 > *str2) return 1;
//	else return -1;*/
//	return *str1 - *str2;
//}
//
//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[] = "abcdef";
//
//	int ret = my_strcmp(arr1, arr2);
//
//	printf("%d\n", ret);
//	return 0;
//}

//int main()
//{
//	char arr1[20] = "abcdef";
//	char arr2[20] = "xxxxxxxx";
//	char arr3[20] = "xxxxxxxxxx";
//
//	strncpy(arr2, arr1, 3);
//	strncpy(arr3, arr1, 8);
//	printf("%s\n", arr2);
//	printf("%s\n", arr3);
//
//	return 0;
//}

//int main()
//{
//	char arr1[20] = "abcdef\0yyyyyyyy";
//	char arr2[20] = "xxxxxxxx";
//
//	strncat(arr1, arr2, 3);
//
//	printf("%s\n", arr1);
//	return 0;
//}

//int main()
//{
//	char arr1[20] = "abcdef";
//	char arr2[20] = "ab";
//
//	int ret = strncmp(arr1, arr2, 4);
//
//	printf("%d\n", ret);
//	return 0;
//}

//int main()
//{
//	char arr[] = "xiezhuxian@yeah.net";
//	char buf[256] = { 0 };
//	strcpy(buf, arr);
//	//char sep[] = "@.";
//	char* sep = "@.";
//
//	char* ret = NULL;
//	for (ret = strtok(buf, sep); ret != NULL; ret = strtok(NULL, sep))
//	{
//		printf("%s\n", ret);
//	}
//
//	/*char* ret = strtok(buf, sep);
//	printf("%s\n", ret);
//	ret = strtok(NULL, sep);
//	printf("%s\n", ret);
//	ret = strtok(NULL, sep);
//	printf("%s\n", ret);
//
//	ret = strtok(NULL, sep);
//	printf("%s\n", ret);*/
//	return 0;
//}

//const char* my_strstr(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	const char* s1 = NULL;
//	const char* s2 = NULL;
//	const char* cur = str1;
//
//	if (*str2 == '\0')
//		return str1;
//
//	while (*cur)
//	{
//		s1 = cur;
//		s2 = str2;
//
//		while (*s1 && *s2 && *s1 == *s2)
//		{
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0')
//			return cur;
//		cur++;
//	}
//	return NULL;
//}
//
//int main()
//{
//	char arr[] = "abbbcdef";
//	char* p = "bbc";
//	char* ret = my_strstr(arr, p);
//
//	printf("%s\n", ret);
//	return 0;
//}

//#include<errno.h>
//int main()
//{
//	int i = 0;
//	for (i = 0; i <= 10; i++)
//	{
//		printf("%d: %s\n", i, strerror(i));
//	}
//	return 0;
//}

//#include<errno.h>
//int main()
//{
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		printf("打开文件失败，原因是: %s\n", strerror(errno));
//		perror("打开文件失败，原因是");
//		//perror = printf + strerror
//		return 1;
//	}
//	else
//	{
//		printf("打开文件成功\n");
//		fclose(pf);
//		pf = NULL;
//	}
//	return 0;
//}

//void* my_memcpy(void* dest, const void* src, size_t num)
//{
//	assert(dest && src);
//	void* ret = dest;
//	for (int i = 0; i < num; i++)
//	{
//		*(char*)dest = *(char*)src;
//		dest = (char*)dest + 1;
//		src = (char*)src + 1;
//	}
//	return ret;
//}
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[20] = { 0 };
//	my_memcpy(arr2, arr1, 20);
//	for (int i = 0; i < 10; i++) printf("%d ", arr2[i]);
//	return 0;
//}

//void* my_memmove(void* dest, const void* src, size_t num)
//{
//	assert(dest && src);
//	void* ret = dest;
//
//	if (dest < src) // 前->后
//	{
//		while (num--)
//		{
//			*(char*)dest = *(char*)src;
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else { // 后->前
//		while (num--)
//		{
//			*((char*)dest + num) = *((char*)src + num);
//		}
//	}
//	return ret;
//}
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	memmove(arr + 2, arr, 20);
//
//	for (int i = 0; i < 10; i++) printf("%d ", arr[i]);
//	return 0;
//}

//void* my_memset(void* dest, int val, size_t num)
//{
//	assert(dest);
//	void* ret = dest;
//	while (num--)
//	{
//		*(char*)dest = val;
//		dest = (char*)dest + 1;
//	}
//	return ret;
//}
//int main()
//{
//	char arr[] = "hello world";
//	my_memset(arr, 'x', 5);
//	printf("%s\n", arr);
//	return 0;
//}

int my_memcmp(const void* ptr1, const void* ptr2, size_t num)
{
	assert(ptr1 && ptr2);
	while (num--)
	{
		if (*(char*)ptr1 > *(char*)ptr2)
			return 1;
		else if (*(char*)ptr1 < *(char*)ptr2)
			return -1;
		else {
			ptr1 = (char*)ptr1 + 1;
			ptr2 = (char*)ptr2 + 1;
		}
	}
	return 0;
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
	int arr2[] = { 1,2,3,6,5 };
	//01 00 00 00 02 00 00 00 03 00 00 00 06 00 00 00 05 00 00 00
	int ret = memcmp(arr2, arr1, 16);

	printf("%d\n", ret);
	return 0;
}